#include <iostream>
namespace test
{
template<class Iterator, class Ref, class Ptr>
struct reverse_iterator
{
    typedef reverse_iterator<Iterator, Ref, Ptr> self;

    reverse_iterator(Iterator it)
        : _cur(it)
    {}

    Ref operator*()
    {
        Iterator tmp(_cur);
        return *--tmp;
    }

    Ptr operator->()
    {
        return &operator*();
    }

    self& operator++()
    {
        --_cur;
        return *this;
    }

    self& operator++(int)
    {
        self tmp(*this);
        --_cur;
        return tmp;
    }

    self& operator--()
    {
        ++_cur;
        return *this;
    }

    self& operator--(int)
    {
        self tmp(*this);
        ++_cur;
        return tmp;
    }

    bool operator!=(const self& s)
    {
        return _cur != s._cur;
    }

    Iterator _cur;
};

}